package rpg.narrativa;

import java.io.*;
import java.net.*;
import java.util.ArrayList;
import rpg.cenario.*;
import rpg.desafio.Desafio;
import rpg.personagem.*;
import rpg.recurso.Alimento;
import rpg.recurso.Armamento;
import rpg.recurso.Cantil;
import rpg.recurso.Estado;
import rpg.recurso.Liquido;
import rpg.recurso.Mapa;
import rpg.recurso.TipoArmamento;

/**
 * Narrativa
 *
 * @author Gabriel Bronzatti Moro
 * @since 08/01/2013
 * @version 0.3
 */
public class Narrativa {

    private Mensageiro mensageiro;
    private Cenario cenario;
    private Estacao estacao;
    private Mapa mapa;
    private ArrayList<Lugar> lugaresPercorridos;

    /**
     * Método construtor responsável por : criar menságeiro inicializar seus
     * status; criar objetos de entradaDeDados, cenario e ProcessarTexto;
     *
     * @throws URISyntaxException
     * @throws IOException
     */
    public Narrativa() {
        this.lugaresPercorridos = new ArrayList<>();

        this.cenario = new Cenario();
        this.mapa = new Mapa("Mapa do Jogo", 1, "Localização");
    }

    /**
     * Inicia o rpg e seta o nome do mensageiro...
     * e cria os recursos, desafios e personagens em todos os lugares
     */
    public boolean iniciarJogo(String nome) {
        this.mensageiro = new Mensageiro(nome.toUpperCase(), 100, 50, 50, 80);

        this.getMensageiro().getRecursos().add(new Cantil("Cantil1", 4, 3, "Para sobrevivencia"));
        this.getMensageiro().getRecursos().add(new Cantil("CantilExtra", 4, 3, "Para sobrevivencia"));
        criarRecursosEmLugares();
        criarDesafioEmLugares();
        criarPersonagemEmLugares();
        // percorrerLocais();
        return true;

    }

    /**
     * finalizarJogo refere-se a entrega da carta do mensageiro
     */
    public void finalizarJogo(boolean resposta) {
        if (resposta) {
            System.exit(0);
        } else {
            this.estacao.morteDoPersonagem(this.mensageiro);
        }
    }

    /**
     * Método responsável por criar personagem em cada lugar do cenário
     */
    private void criarPersonagemEmLugares() {
        //LUGAR INICIO
        this.cenario.getListaDeLugares().get(0).setPersonagem(new Amigo("Lanterna Verde", 100, 100, 100, "Amigo: 'Pegue todos os alimentos que consiguir'", 1));
        //LUGAR 1
        this.cenario.getListaDeLugares().get(1).setPersonagem(new Amigo("Batman", 100, 100, 100, "Amigo: 'Pegue todos os líquidos deste lugar'", 2));
        //LUGAR 2
        this.cenario.getListaDeLugares().get(2).setPersonagem(new Inimigo("O Incrível Hulk", 80, 70, 100, 3));
        //LUGAR 3
        this.cenario.getListaDeLugares().get(3).setPersonagem(new Inimigo("John del Pampa", 90, 90, 30, 3));
        //LUGAR 4
        this.cenario.getListaDeLugares().get(4).setPersonagem(new Amigo("Lanterna Verde", 100, 100, 100, "Amigo: 'Pegue todos os alimentos que consiguir'", 5));
        //LUGAR 5
        this.cenario.getListaDeLugares().get(5).setPersonagem(new Inimigo("Duende verde", 80, 70, 60, 3));
        //LUGAR 6
        this.cenario.getListaDeLugares().get(6).setPersonagem(new Amigo("Lanterna Verde", 100, 100, 100, "Amigo: 'Pegue todos os alimentos que consiguir'", 5));
        //LUGAR 7
        this.cenario.getListaDeLugares().get(7).setPersonagem(new Inimigo("John del Pampa", 100, 100, 50, 5));
        //LUGAR FIM
        this.cenario.getListaDeLugares().get(8).setPersonagem(new Inimigo("Chuck Norris extreme ultimate fortão elevado no mais alto nível de fortesa ambulante", 100, 100, 100, 6));
    }

    /**
     * Método responsável por criar recursos em cada lugar do cenário
     */
    private void criarRecursosEmLugares() {
        //LUGAR INICIO
        this.cenario.getListaDeLugares().get(0).addRecurso(new Alimento("Doritos", 23, 3, Estado.Bom));
        this.cenario.getListaDeLugares().get(0).addRecurso(new Alimento("Carne Assada", 80, 40, Estado.Otimo));
        this.cenario.getListaDeLugares().get(0).addRecurso(new Liquido("Coca-zero", 2, 14, Estado.Otimo, 9, 20));
        //LUGAR 1
        this.cenario.getListaDeLugares().get(1).addRecurso(new Liquido("Água H20 Aromatizada", 2, 60, Estado.Otimo, 60, 60));
        this.cenario.getListaDeLugares().get(1).addRecurso(new Liquido("Fanta Uva", 2, 20, Estado.Bom, 20, 20));
        this.cenario.getListaDeLugares().get(1).addRecurso(new Alimento("Cabeça de cobra assada", 30, 30, Estado.Otimo));
        //LUGAR 2
        this.cenario.getListaDeLugares().get(2).addRecurso(new Liquido("Caliandra Canha", 2, 9, Estado.Ruim, 2, 29));
        this.cenario.getListaDeLugares().get(2).addRecurso(new Armamento("Armadura do Capitão Améria", 1, 2, 12, TipoArmamento.Armadura));
        this.cenario.getListaDeLugares().get(2).addRecurso(new Alimento("Porco Assado na tempre", 30, 30, Estado.Otimo));
        //LUGAR 3
        this.cenario.getListaDeLugares().get(3).addRecurso(new Liquido("Velho Barreiro", 2, 60, Estado.Otimo, 60, 60));
        this.cenario.getListaDeLugares().get(3).addRecurso(new Armamento("Bazuca", 1, 12, 2, TipoArmamento.Arma));
        this.cenario.getListaDeLugares().get(3).addRecurso(new Alimento("Galinha Caipira Crua", 30, 30, Estado.Otimo));
        //LUGAR 4
        this.cenario.getListaDeLugares().get(4).addRecurso(new Alimento("Feijão", 90, 3, Estado.Bom));
        this.cenario.getListaDeLugares().get(4).addRecurso(new Alimento("Arroz", 90, 40, Estado.Otimo));
        this.cenario.getListaDeLugares().get(4).addRecurso(new Liquido("Azeite", 2, 14, Estado.Otimo, 2, 2));
        //LUGAR 5
        this.cenario.getListaDeLugares().get(5).addRecurso(new Liquido("Fanta Maracujá", 2, 60, Estado.Otimo, 60, 60));
        this.cenario.getListaDeLugares().get(5).addRecurso(new Liquido("Fanta Laranja", 2, 20, Estado.Bom, 20, 20));
        this.cenario.getListaDeLugares().get(5).addRecurso(new Alimento("Cabeça de minhoca", 30, 30, Estado.Otimo));
        //LUGAR 6
        this.cenario.getListaDeLugares().get(6).addRecurso(new Alimento("Lasanha", 90, 3, Estado.Bom));
        this.cenario.getListaDeLugares().get(6).addRecurso(new Alimento("Repolho", 9, 4, Estado.Ruim));
        this.cenario.getListaDeLugares().get(6).addRecurso(new Liquido("Graspa", 12, 13, Estado.Otimo, 2, 2));
        //LUGAR 7
        this.cenario.getListaDeLugares().get(7).addRecurso(new Liquido("Wisky OLho de Tigre", 2, 60, Estado.Otimo, 60, 60));
        this.cenario.getListaDeLugares().get(7).addRecurso(new Armamento("Pistola", 2, 10, 21, TipoArmamento.Arma));
        this.cenario.getListaDeLugares().get(7).addRecurso(new Alimento("Rã assada", 30, 30, Estado.Otimo));
        //LUGAR FIM
        this.cenario.getListaDeLugares().get(8).addRecurso(new Liquido("Cerveja", 29, 99, Estado.Otimo, 39, 99));
        this.cenario.getListaDeLugares().get(8).addRecurso(new Armamento("Armadura do Centurião Dourado", 1, 2, 12, TipoArmamento.Armadura));
        this.cenario.getListaDeLugares().get(8).addRecurso(new Alimento("Vazio de gado assado", 70, 50, Estado.Otimo));
    }

    /**
     * Método responsável por criar desafio em cada lugar do cenário
     */
    private void criarDesafioEmLugares() {
        //LUGAR INICIO
        this.cenario.getListaDeLugares().get(0).setDesafio(new Desafio(this.mensageiro));
        this.cenario.getListaDeLugares().get(0).getDesafio().necessitaRecurso(this.cenario.getListaDeLugares().get(0).getListaDeRecursos().get(1));
        //LUGAR 1
        this.cenario.getListaDeLugares().get(1).setDesafio(new Desafio(this.mensageiro));
        this.cenario.getListaDeLugares().get(1).getDesafio().necessitaRecurso(this.cenario.getListaDeLugares().get(1).getListaDeRecursos().get(0));
        //LUGAR 2
        this.cenario.getListaDeLugares().get(2).setDesafio(new Desafio(this.mensageiro));
        //this.estacao.paradaConfronto(this.cenario.getListaDeLugares().get(2), this.mensageiro);
        //LUGAR 3
        this.cenario.getListaDeLugares().get(3).setDesafio(new Desafio(this.mensageiro));
        //this.estacao.paradaConfronto(this.cenario.getListaDeLugares().get(3), this.mensageiro);
        //LUGAR 4
        this.cenario.getListaDeLugares().get(4).setDesafio(new Desafio(this.mensageiro));
        //this.cenario.getListaDeLugares().get(4).getDesafio().necessitaRecurso(this.cenario.getListaDeLugares().get(4).getListaDeRecursos().get(1));
        //LUGAR 5
        this.cenario.getListaDeLugares().get(5).setDesafio(new Desafio(this.mensageiro));
        //this.estacao.paradaConfronto(this.cenario.getListaDeLugares().get(5), this.mensageiro);
        //LUGAR 6
        this.cenario.getListaDeLugares().get(6).setDesafio(new Desafio(this.mensageiro));
        this.cenario.getListaDeLugares().get(6).getDesafio().necessitaRecurso(this.cenario.getListaDeLugares().get(6).getListaDeRecursos().get(1));
        //LUGAR 7
        this.cenario.getListaDeLugares().get(7).setDesafio(new Desafio(this.mensageiro));
        // this.estacao.paradaConfronto(this.cenario.getListaDeLugares().get(7), this.mensageiro);
        //LUGAR FIM
        this.cenario.getListaDeLugares().get(8).setDesafio(new Desafio(this.mensageiro));
        //this.estacao.paradaConfronto(this.cenario.getListaDeLugares().get(8), this.mensageiro);
    }

    /**
     * Método responsável por setar o lugar atual do mensageiro...
     *
     * @throws URISyntaxException
     * @throws IOException
     * @throws FileNotFoundException
     */
    public void percorrerLocais(int numeroDoLugar, int opcao) {
        this.mensageiro.setLocalAtual(this.cenario.getListaDeLugares().get(numeroDoLugar - 1));
        this.lugaresPercorridos.add(this.mensageiro.getLocalAtual());
        this.estacao.paradaCenario(opcao, this.mensageiro.getLocalAtual(), this.mensageiro);
        finalizarJogo(true);
    }

    /**
     * Retorna objeto mensageiro
     *
     * @return
     */
    public Mensageiro getMensageiro() {
        return mensageiro;
    }

    /**
     * Retorna objeto Cenario
     *
     * @return
     */
    public Cenario getCenario() {
        return cenario;
    }

    /**
     * @return o objeto estação
     */
    public Estacao getEstacao() {
        return estacao;
    }

    /**
     * @return o objeto lugaresPercorridos
     */
    public ArrayList<Lugar> getArrayLugaresPercorridos() {
        return lugaresPercorridos;
    }
}
